﻿using System.Collections.Generic;
using UnityEngine;

public enum SoldierTransition
{
    NullTransition = 0,
    SeeEnemy,
    NoEnemy,
    CanAttack,
}

public enum SoldierStateId
{
    NullStateId,
    Idel,
    Chase,
    Attack,
}

public abstract class ISoldierState
{
    protected Dictionary<SoldierTransition, SoldierStateId> mMap = new Dictionary<SoldierTransition, SoldierStateId>();
    protected SoldierStateId mStateId;
    protected ICharacter mCharacter;
    protected SoldierFSMSystem mFSM;
    public SoldierStateId StateId => mStateId;

    public ISoldierState(SoldierFSMSystem fsm, ICharacter character)
    {
        mFSM = fsm;
        mCharacter = character;
    }

    public void AddTransition(SoldierTransition trans, SoldierStateId id)
    {
        if (trans == SoldierTransition.NullTransition)
        {
            Debug.LogError("SoldierTransition 为空!");
            return;
        }

        if (id == SoldierStateId.NullStateId)
        {
            Debug.LogError("SoldierStateId为空!");
            return;
        }

        if (mMap.ContainsKey(trans))
        {
            Debug.LogError("包含该SoldierTransition，请勿重复添加");
            return;
        }

        mMap.Add(trans, id);
    }

    public void DeleteTransition(SoldierTransition trans)
    {
        if (trans == SoldierTransition.NullTransition)
        {
            Debug.LogError("SoldierTransition 为空");
            return;
        }

        if (mMap.ContainsKey(trans))
        {
            mMap.Remove(trans);
            return;
        }

        Debug.LogError("错误：删除SoldierTransition时出现错误!");
    }

    public SoldierStateId GetOutputState(SoldierTransition trans)
    {
        if (mMap.ContainsKey(trans))
        {
            return mMap[trans];
        }

        return SoldierStateId.NullStateId;
    }

    public virtual void DoBeforeEntering()
    {
    }

    public virtual void DoBeforeLeaving()
    {
    }

    public abstract void Reasoning(List<ICharacter> targets);
    public abstract void Actioning(List<ICharacter> targets);
}